package com.renu.jdependencyanalyser.soot;

import com.renu.jdependencyanalyser.cons.ProjectCons;
import com.renu.jdependencyanalyser.utils.MyFileUtil;
import com.renu.jdependencyanalyser.utils.MyProjectUtil;
import soot.G;
import soot.Scene;
import soot.SootClass;
import soot.options.Options;
import soot.util.Chain;

import java.io.File;
import java.util.*;

public class SootOptionSet {
    /**
     * IR Jimple 的输出目录
     */
    //public static final String output ;

    /**
     * 分析的源目录
     */
    //public static final String sourceDirectory = System.getProperty("user.dir") + File.separator + "target" + File.separator + "classes";

    public static void  setupSoot(String srcPath, String outPath) {
        G.reset();

        List<String> srcPaths = collectSrcPaths(MyProjectUtil.projectBasePath);
        // 输出格式
        Options.v().set_output_dir(outPath); // 设置 IR Jimple 的输出目录
        Options.v().set_output_format(Options.output_format_jimple); // 输出格式

        Options.v().set_process_dir(srcPaths);    // 待分析的路径
        // Options.v().set_soot_classpath(sourceDirectory);    // JDK 和待分析的 jar 都要加入 classpath

        Options.v().set_prepend_classpath(true); // -pp
        Options.v().set_allow_phantom_refs(true);
        Options.v().set_keep_line_number(true);

        Options.v().set_whole_program(true);    // 全程序分析
        Options.v().set_verbose(true);          // 显示详细信息

//    Scene.v().loadBasicClasses();
        Scene.v().loadNecessaryClasses();   // 加载 Soot 依赖的类和命令行指定的类
//        Scene.v().loadDynamicClasses();
//        Chain<SootClass> applicationClasses = Scene.v().getApplicationClasses();
//        return applicationClasses;
        //System.out.println(applicationClasses);

    }

    public static void  setupSoot2(String srcPath, String outPath) {
        G.reset();

        List<String> srcPaths = collectSrcPaths(MyProjectUtil.projectBasePath);
        // 输出格式
        Options.v().set_output_dir(outPath); // 设置 IR Jimple 的输出目录
        Options.v().set_output_format(Options.output_format_jimple); // 输出格式

        Options.v().set_process_dir(Arrays.asList(MyProjectUtil.projectBasePath+ProjectCons.SCR_INPUT_PATH));    // 待分析的路径
         Options.v().set_soot_classpath(String.join(":",srcPaths));    // JDK 和待分析的 jar 都要加入 classpath

        Options.v().set_prepend_classpath(true); // -pp
        Options.v().set_allow_phantom_refs(true);
        Options.v().set_keep_line_number(true);

        Options.v().set_whole_program(true);    // 全程序分析
        Options.v().set_verbose(true);          // 显示详细信息

//    Scene.v().loadBasicClasses();
        Scene.v().loadNecessaryClasses();   // 加载 Soot 依赖的类和命令行指定的类
//        Scene.v().loadDynamicClasses();
//        Chain<SootClass> applicationClasses = Scene.v().getApplicationClasses();
//        return applicationClasses;
        //System.out.println(applicationClasses);

    }
    private static List<String> collectSrcPaths(String projectBasePath) {
        ArrayList<String> srcPaths = new ArrayList<>();
        srcPaths.add(projectBasePath + ProjectCons.SCR_INPUT_PATH);
        Set<String> jarPath = MyFileUtil.findJarPath(new File(projectBasePath + ProjectCons.JAR_PATH));
        srcPaths.addAll(jarPath);
        return srcPaths;

    }



}
